\chapter{Génération statique d'un fichier de description des fonctions}
On souhaite ici observer le comportement mémoire d'une fonction. On entend par comportement mémoire le nombre d'accès de type {\tt store} et de type {\tt load}. Nous prenons pour hypothèse que les variables sont déjà stockées en registre et ne nous intéressons qu'aux accès à des tableaux. En sortie, nous obtiendrons un fichier comportant le nombre de loads et de stores de chaque fonction instrumentée.

\section{Mise en place}
Pour cela nous mettons en place une première passe. Celle-ci est appelée après \*record\_bounds car nous avons besoin de récupérer le nombre d'itérations effectuées sur une boucle. Pour que notre passe s'exécute il faut également que la compilation soit effectuée avec le flag -O3.

Le gate de la passe testera simplement si la fonction en cours de compilation est présente dans le vecteur contenant les fonctions instrumentées par l'utilisateur.

\section{Fonctionnement}
L'exécution se décompose en quatre parties décrites dans paragraphes suivants.

\subsubsection{Notion de pondération}
Dans un premier temps nous initialisons les uids de tous les statements de chaque basic bloc de la fonction à 1. Nous allons nous servir de ces champs pour introduire une notion de pondération. Pour cela nous utilisons les macros FOR\_ALL\_BB et l'itérateur gimple\_stmt\_iterator.

Dans un second temps nous parcourons récursivement toutes les boucles de la fonction afin de récupérer les nombres d'itérations à l'aide de la fonction get\_number\_iter. Nous écrivons alors cette valeur dans le champ uid du statement. Cette valeur nous sert de pondération. En effet, si un store ou un load est effectué dans cette boucle, il sera effectué n fois, n étant le nombre d'itérations.

\subsubsection{Traitement des affectations}
Dans un troisième temps nous parcourons une nouvelle fois tous les statements de tous les basic blocs de la fonction. Cette fois-ci nous recherchons des statements de type GIMPLE\_ASSIGN. En effet, lorsqu'il y a une affectation nous savons qu'il y a un accès à des variables, nous vérifions donc s'il s'agit de tableaux. Pour cela nous récupérons les opérandes du statement et les décodons.
S'il s'agit d'un ARRAY\_REF (tableau) ou d'un MEM\_REF (accès mémoire, par exemple lorsque l'on accède à un tableau passé par référence à une fonction), nous incrémentons les compteurs de loads ou de store selon que l'opérande se situe à droite ou à gauche de l'affectation.

\subsubsection{Ecriture du fichier trace}
Enfin, le totaux sont écrits dans un fichier de traces sous la forme :
\begin{verbatim}
function toto
2000 loads
1000 stores
...
\end{verbatim}

Nous pouvons noter que malheureusement cette passe ne peut fonctionner correctement que lorsque le nombre d'itérations de la boucle a été correctement récupéré par la passe \*record\_bounds. En effet, si la borne est une variable, le nombre d'itérations stockées est proche de la valeur INT\_MAX, donc incohérent.